package ar.edu.utn.frba.gdaia.src.action;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import ar.edu.utn.frba.gdaia.src.domain.Canal;
import ar.edu.utn.frba.gdaia.src.domain.RepresentacionVisual;

import ar.edu.utn.frba.gdaia.src.domain.ConceptoElemental;
import ar.edu.utn.frba.gdaia.src.externalinterface.Mensaje;
import ar.edu.utn.frba.gdaia.src.externalinterface.TextInterface;
import ar.edu.utn.frba.gdaia.src.main.Cerebro;

/**
 * Esta clase sire para ingresar al cerebro los datos obtenidos
 * luego de procesar la imagen
 */
public class ReadDrawingsCommand extends Command {

	/**
	 * Recibe: Cerebro
	 * 		   TextInterface
	 */
	public void execute(Map parameters) {

		// se obtiene la entrada de la interfaz grafica
		TextInterface gui = (TextInterface) parameters.get(Command.INTERFACE_EXTERNA);

		Cerebro cerebro = (Cerebro) parameters.get(Command.CEREBRO);

		// TODO: OJO hay que considerar que puede ser un mensaje que no sea para
		// readwords 
		cerebro.setMensajeUIToMind((Mensaje) gui.getFromUIToMind());
		Mensaje mensaje = cerebro.getMensajeUIToMind();

		// verificamos que el canal de ingreso sea visual
		if (mensaje.getCanalIngreso() == Canal.VISUAL) {

			List listaDeDrawings = (List) mensaje.getPayload();

			List<ConceptoElemental> listaDeConceptosActuales = new ArrayList<ConceptoElemental>();

			// itero los dibujos recibidos para crear los conceptos
			for (Iterator it1 = listaDeDrawings.iterator(); it1.hasNext();) {
				//TODO JPM: Ver si hace falta castearlo a RepresentacionVisual, o si se puede usar Object y hacer lo mismo para readWords
				RepresentacionVisual representacionVisual = (RepresentacionVisual) it1.next();
				ConceptoElemental conceptoElemental = new ConceptoElemental(cerebro.getNextConceptNumber(), representacionVisual, mensaje.getCanalIngreso(), 0);
				// agrego el concepto elemental encontrado
				cerebro.getConceptos().add(conceptoElemental);

				// agrego el concepto, a la lista
				// para utilizarla como filtro para
				// buscar si existe una situacion.
				listaDeConceptosActuales.add(conceptoElemental);
			}

			// seteamos la ultima lista de conceptos leidos.
			cerebro.setListaUltimosConceptosLeidos(listaDeConceptosActuales);
			// liberamos el Mensaje que vino desde la GUI
			cerebro.setMensajeUIToMind(null);
		}
	}
}
